package com.zhkc.wisdom.common.pojo.vo;

import com.zhkc.wisdom.common.pojo.enums.ResponseCodeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.Map;

/**
 * Description: 统一响应结果
 * User: zzw
 * Date: 2023/8/17
 * Time: 13:30
 * company:zhkc
 */
@Schema(description = "统一响应结果")
@Data
@Accessors(chain = true)
@SuppressWarnings("all")
public class ResultVO<T> {
    /**
     * 状态码
     */
    @Schema(description = "状态码")
    private Integer code;

    /**
     * 响应信息
     */
    @Schema(description = "响应信息")
    private String msg;

    /**
     * 数据
     */
    @Schema(description = "数据")
    private T data;

    /**
     * 私有构造方法，这样就只能够通过静态方法code()和ok()创建ResponseData对象
     */
    public <T> ResultVO() {
    }

    public ResultVO(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public ResultVO(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 状态码200 + 固定成功信息提示（’success‘）
     *
     * @return 实例Result
     */
    public static <T> ResultVO<T> success() {
        return new ResultVO<T>().setCode(ResponseCodeEnum.SUCCESS.getCode()).setMsg(ResponseCodeEnum.SUCCESS.getMsg());
    }

    /**
     * 状态码200 + 自定义成功信息提示（’success‘）
     *
     * @param data 数据
     * @return 实例Result
     */
    public static <T> ResultVO<T> success(String msg) {
        return new ResultVO<T>().setCode(ResponseCodeEnum.SUCCESS.getCode()).setMsg(msg);
    }

    /**
     * 状态码200 + 固定成功信息提示（’success‘）+ 自定义数据
     *
     * @param data 数据
     * @return 实例Result
     */
    public static <T> ResultVO<T> success(T data) {
        return new ResultVO<T>().setCode(ResponseCodeEnum.SUCCESS.getCode()).setMsg(ResponseCodeEnum.SUCCESS.getMsg()).setData(data);
    }

    /**
     * 状态码200 + 自定义成功信息提示（’success‘）+ 自定义数据
     *
     * @param data 数据
     * @return 实例Result
     */
    public static <T> ResultVO<T> success(String msg, T data) {
        return new ResultVO<T>().setCode(ResponseCodeEnum.SUCCESS.getCode()).setMsg(msg).setData(data);
    }

    /**
     * 自定义（’success‘）
     *
     * @return 实例Result
     */
    public static <T> ResultVO<T> success(Integer code, String msg) {
        return new ResultVO<T>().setCode(code).setMsg(msg);
    }

    /**
     * 状态码500 + 固定错误信息提示（'fail'）的失败响应
     *
     * @return 实例Result
     */
    public static <T> ResultVO<T> fail() {
        return new ResultVO<T>().setCode(ResponseCodeEnum.FAIL.getCode()).setMsg(ResponseCodeEnum.FAIL.getMsg());
    }

    /**
     * 状态码500 + 自定义错误信息的失败响应
     *
     * @param msg 错误信息
     * @return 实例Result
     */
    public static <T> ResultVO<T> fail(String msg) {
        return new ResultVO<T>().setCode(ResponseCodeEnum.FAIL.getCode()).setMsg(msg);
    }

    /**
     * 状态码自定义 + 错误信息自定义的失败响应
     *
     * @return 实例Result
     */
    public static <T> ResultVO<T> fail(ResponseCodeEnum errorCodeEnum) {
        return new ResultVO<T>().setCode(errorCodeEnum.getCode()).setMsg(errorCodeEnum.getMsg());
    }

    /**
     * 自定义错误类封装的失败响应
     *
     * @return 实例Result
     */
    public static <T> ResultVO<T> fail(ResponseCodeEnum errorCodeEnum, T data) {
        return new ResultVO<T>().setCode(errorCodeEnum.getCode()).setMsg(errorCodeEnum.getMsg()).setData(data);
    }

    /**
     * 构建返回的JSON数据格式
     *
     * @param status  状态码
     * @param message 信息
     * @return
     */
    public static Map<String, Object> response(int status, String message) {
        Map<String, Object> map = new HashMap<>(16);
        map.put("code", status);
        map.put("msg", message);
        map.put("data", null);
        return map;
    }

}
